#include "fifo_IntHandler.h"

XLlFifo *Fifo_InstancePtr = NULL;
struct Eth_status_cnt Eth_status = {0};
u32 Intc = 0;

void fifo_IntHandler(void *CallBackRef)
{
    XLlFifo *Fifo_ptr = (XLlFifo *)CallBackRef;

    u32 Pending = XLlFifo_IntPending(Fifo_ptr);

    // 判定中断信号内容
    while (Pending)
    {
        // 接收完成中断 如果当前为工作模式 则丢掉数据
        if (Pending & XLLF_INT_RC_MASK)
        {
            if (SYS_MODE_WORK == B1553_get_current_mode())
            {
                XLlFifo_RxReset(Fifo_ptr);
            }
            else
            {
                Eth_status.rx_flag++;  // 待处理次数+1
                Eth_status.FramesRx++; // 接收计数+1
            }

            XLlFifo_IntClear(Fifo_ptr, XLLF_INT_RC_MASK);
        }
        else if (Pending & XLLF_INT_TC_MASK) // 发送完成 发送中断增加
        {
            Eth_status.FramesTx++;
            XLlFifo_IntClear(Fifo_ptr, XLLF_INT_TC_MASK);
        }
        else if (Pending & XLLF_INT_ERROR_MASK) // 存在错误时 记录错误码
        {
            Eth_status.FifoErrCode = Pending & XLLF_INT_ERROR_MASK;
            XLlFifo_IntClear(Fifo_ptr, XLLF_INT_ERROR_MASK);
        }
        else // 其他中断
        {
            XLlFifo_IntClear(Fifo_ptr, Pending);
        }
        Pending = XLlFifo_IntPending(Fifo_ptr);
    }

    XIntc_Acknowledge(&Intc, XPAR_INTC_0_LLFIFO_0_VEC_ID);
    XIntc_Acknowledge(&Intc, XPAR_INTC_0_LLFIFO_1_VEC_ID);
    XLlFifo_IntClear(Fifo_ptr, Pending);
    return;
}